import 'package:dio/dio.dart';

import 'base_view_model.dart';
import '../utils/error_handler.dart';

/// 网络请求基础 ViewModel
/// 提供通用的网络请求处理和分页功能
abstract class BaseNetworkViewModel extends BaseViewModel {
  final Dio _dio = Dio();

  /// 获取 Dio 实例
  Dio get dio => _dio;

  /// 执行网络请求
  /// [request] 网络请求函数
  /// [showLoading] 是否显示加载状态
  Future<T> performRequest<T>(
    Future<T> Function() request, {
    bool showLoading = true,
  }) async {
    if (showLoading) setLoading();

    try {
      final result = await request();
      setSuccess();
      return result;
    } catch (error, stackTrace) {
      setError(error.toString());
      ErrorHandler.handleError(error, stackTrace);
      rethrow;
    }
  }

  /// 执行分页请求
  /// [request] 分页请求函数，接收页码参数
  /// [targetList] 目标列表
  /// [isRefresh] 是否为刷新操作
  /// [pageSize] 每页数据量，用于计算页码
  Future<void> performPaginatedRequest<T>(
    Future<List<T>> Function(int page) request,
    List<T> targetList, {
    bool isRefresh = false,
    int pageSize = 20,
  }) async {
    try {
      if (isRefresh) {
        setLoading();
        targetList.clear();
      }

      final currentPage = isRefresh ? 1 : (targetList.length ~/ pageSize) + 1;
      final results = await request(currentPage);

      if (results.isEmpty) {
        if (targetList.isEmpty) {
          setEmpty();
        } else {
          setNoMore();
        }
      } else {
        targetList.addAll(results);
        setSuccess();
      }
    } catch (error, stackTrace) {
      setError(error.toString());
      ErrorHandler.handleError(error, stackTrace);
    }
  }

  /// 静默执行网络请求（不改变页面状态）
  /// [request] 网络请求函数
  Future<T> performSilentRequest<T>(Future<T> Function() request) async {
    try {
      return await request();
    } catch (error, stackTrace) {
      ErrorHandler.handleError(error, stackTrace);
      rethrow;
    }
  }

  @override
  void dispose() {
    _dio.close();
    super.dispose();
  }
}
